package com.gx.service;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gx.common.result.AppResult;
import com.gx.model.dto.QueryMediaParamsDto;
import com.gx.model.dto.UploadFileParamsDto;
import com.gx.model.po.TbFiles;
import com.gx.model.result.UploadFileResultDto;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;

/**
 * @Author Liu-pj
 * @Date 2023/3/7 17:19
 * @Desc 文件上传service
 **/
public interface FileService {

    /**
     * 媒资文件查询方法
     *
     * @param queryMediaParamsDto 查询条件
     * @return 结果
     */
    Page<TbFiles> queryMediaFiles(QueryMediaParamsDto queryMediaParamsDto);


    /**
     * 上传文件的通用接口
     *
     * @param uploadFileParamsDto 文件信息
     * @param bytes               文件字节数组
     * @param folder              桶下边的子目录
     * @param objectName          对象名称
     * @return 结果
     */
    UploadFileResultDto uploadFile(UploadFileParamsDto uploadFileParamsDto, byte[] bytes, String folder, String objectName);

    /**
     * 将文件信息入库
     *
     * @param fileId              文件id
     * @param uploadFileParamsDto 参数
     * @param bucket              桶
     * @param objectName          名称
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    TbFiles addMediaFilesToDb(String fileId, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName);

    /**
     * 检查分块是否存在
     *
     * @param fileMd5    文件的md5
     * @param totalChunk 分块序号
     * @return 返回当前的分块
     */
    AppResult<Integer> checkChunk(String fileMd5, Integer totalChunk);

    /**
     * 上传分块
     *
     * @param fileMd5 文件md5
     * @param chunk   分块序号
     * @param bytes   文件字节
     * @return 结果
     */
    AppResult<Boolean> uploadChunk(String fileMd5, int chunk, byte[] bytes);


    /**
     * 合并分块
     *
     * @param uploadFileParamsDto 文件信息
     * @return 结果
     */
    AppResult<Boolean> mergeChunks(UploadFileParamsDto uploadFileParamsDto);

    /**
     * 根据id查询文件信息
     *
     * @param id 文件id
     * @return 文件信息
     */
    TbFiles getFileById(String id);

    /**
     * 根据桶和文件路径从minio下载文件
     *
     * @param file       文件路径
     * @param bucket     桶
     * @param objectName 路径
     */
    void downloadFileFromMinio(File file, String bucket, String objectName);

    /**
     * 将文件上传到文件系统
     *
     * @param filePath   文件路径
     * @param bucket     桶
     * @param objectName objName
     */
    void addMediaFilesToMinio(String filePath, String bucket, String objectName);
}
